/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.uoc.tds.cliente;

import edu.uoc.tds.bean.Usuario;
import edu.uoc.tds.common.EGestioEventsException;
import edu.uoc.tds.common.MostrarCombo;
import edu.uoc.tds.common.RemotoInterface;
import edu.uoc.tds.common.UtilLenguaje;
import edu.uoc.tds.common.Utils;
import edu.uoc.tds.server.GestorDisco;
import edu.uoc.tds.server.GestorUsuario;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.rmi.RemoteException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.AbstractTableModel;

public class PantallaConsultaUsuario extends javax.swing.JPanel {

    private RemotoInterface objServeis = null;
    private static final long serialVersionUID = 1L;
    //  private JComboBox comboUniversidad = null;
    private JButton botonBuscar = null;
    private JButton botonAlta = null;
    private JTextField nombre = null;
    private JTextField apellidos = null;
    private JTextField numDoc = null;
    private JTextField desde = null;
    private JTextField hasta = null;
    private UtilLenguaje txt = null;
    private JLabel labelNombre = null;
    private JLabel labelApellidos = null;
    private JLabel labelCentro = null;
    private JLabel labelUniversidad = null;
    private JLabel labelTipoDoc = null;
    private JLabel labelPerfil = null;
    private JLabel labelNumDoc = null;
    private JTable tablaResultados = null;
    private JScrollPane jScrollPane = null;
    JScrollPane textScroll = null;
    private JTable table = null;
    private JLabel labelBaja = null;
    private JLabel labelDesde = null;
    private JLabel labelHasta = null;
    private JRadioButton activo = null;
    private JRadioButton desactivo = null;
    private Integer estado = 0;
    private Integer perfil = null;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JComboBox jComboBox2;
    private JRadioButton todos = null;
    private JRadioButton admin = null;
    private JRadioButton secre = null;
    private JRadioButton asist = null;
    private JComboBox comboTipoDoc = null;

    public PantallaConsultaUsuario(RemotoInterface pObjServeis) throws RemoteException {


        super();
        objServeis = pObjServeis;
        initComponents();
        cargarCombos();
    }

    private void cargarCombos() throws RemoteException {
        Vector<MostrarCombo> listaUniversidades = objServeis.listaUniversidades();
        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(listaUniversidades));
        rellenarCentros(new Integer(listaUniversidades.get(0).getID()));
    }

    private void rellenarCentros(Integer idUniversidad) throws RemoteException {
        Vector<MostrarCombo> listaCentrosUniversidad = objServeis.listaCentrosUniversidad(idUniversidad);
        jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(listaCentrosUniversidad));
    }

    private void initComponents() {

        this.setLayout(null);
        this.setBounds(new Rectangle(0, 0, 800, 300));
        this.add(getComboTipoDoc(), null);

        labelTipoDoc = new JLabel();
        labelTipoDoc.setBounds(new Rectangle(10, 90, 100, 20));
        labelTipoDoc.setText(txt.getMessage("pantConsUsu.label.tipoDoc"));
        this.add(labelTipoDoc);

        labelNumDoc = new JLabel();
        labelNumDoc.setBounds(new Rectangle(300, 90, 100, 20));
        labelNumDoc.setText(txt.getMessage("pantConsUsu.label.numDoc"));
        this.add(labelNumDoc);

        labelPerfil = new JLabel();
        labelPerfil.setBounds(new Rectangle(10, 150, 100, 20));
        labelPerfil.setText(txt.getMessage("pantConsUsu.label.perfil"));
        this.add(labelPerfil);

        jComboBox1 = new javax.swing.JComboBox();
        jComboBox2 = new javax.swing.JComboBox();

        jComboBox1.setBounds(new Rectangle(150, 5, 275, 20));
        jComboBox1.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBox1ActionPerformed(evt);
            }
        });

        jComboBox2.setBounds(new Rectangle(150, 30, 275, 20));
        this.add(jComboBox1);
        this.add(jComboBox2);

        activo = new JRadioButton("NO");
        activo.setBounds(new Rectangle(150, 180, 50, 20));
        activo.setMnemonic(0);
        activo.setActionCommand("NO");
        activo.setSelected(true);

        desactivo = new JRadioButton("SI");
        desactivo.setBounds(new Rectangle(200, 180, 50, 20));
        desactivo.setMnemonic(1);
        desactivo.setActionCommand("SI");

        // Group the radio buttons.
        ButtonGroup group = new ButtonGroup();
        group.add(activo);
        group.add(desactivo);

        this.add(activo);
        this.add(desactivo);

        desactivo.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent e) {
                estado = null;
            }
        });

        activo.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent e) {
                estado = 0;
            }
        });

        labelCentro = new JLabel();
        labelCentro.setBounds(new Rectangle(10, 30, 100, 20));
        labelCentro.setText(txt.getMessage("pantConsUsu.label.centro"));
        this.add(labelCentro);

        labelNombre = new JLabel();
        labelNombre.setBounds(new Rectangle(10, 60, 100, 20));
        labelNombre.setText(txt.getMessage("pantConsUsu.label.nombre"));
        this.add(labelNombre);

        labelDesde = new JLabel();
        labelDesde.setBounds(new Rectangle(10, 120, 100, 20));
        labelDesde.setText(txt.getMessage("pantConsUsu.label.desde"));
        this.add(labelDesde);

        nombre = new JTextField(10);
        nombre.setBounds(new Rectangle(150, 60, 130, 20));
        this.add(nombre);

        desde = new JTextField(10);
        desde.setBounds(new Rectangle(150, 120, 130, 20));
        this.add(desde);

        labelApellidos = new JLabel();
        labelApellidos.setBounds(new Rectangle(300, 60, 100, 20));
        labelApellidos.setText(txt.getMessage("pantConsUsu.label.apellidos"));
        this.add(labelApellidos);

        labelHasta = new JLabel();
        labelHasta.setBounds(new Rectangle(300, 120, 100, 20));
        labelHasta.setText(txt.getMessage("pantConsUsu.label.hasta"));
        this.add(labelHasta);

        apellidos = new JTextField(10);
        apellidos.setBounds(new Rectangle(380, 60, 200, 20));
        this.add(apellidos);

        numDoc = new JTextField(10);
        numDoc.setBounds(new Rectangle(380, 90, 130, 20));
        this.add(numDoc);

        hasta = new JTextField(10);
        hasta.setBounds(new Rectangle(380, 120, 130, 20));
        this.add(hasta);

        labelUniversidad = new JLabel();
        labelUniversidad.setBounds(new Rectangle(10, 5, 100, 20));
        labelUniversidad.setText(txt.getMessage("pantConsCentro.label.universidad"));
        this.add(labelUniversidad);

        labelBaja = new JLabel();
        labelBaja.setBounds(new Rectangle(10, 180, 150, 20));
        labelBaja.setText(txt.getMessage("pantConsCentro.label.baja"));
        this.add(labelBaja);

        this.add(getBotonBuscar(), null);
        this.add(getBotonAlta(), null);
        tablaResultados = new JTable();
        tablaResultados.addMouseListener(new MouseAdapter() {

            public void mouseClicked(MouseEvent e) {
                int fila = tablaResultados.rowAtPoint(e.getPoint());
                Integer idUsuario = new Integer(tablaResultados.getModel().getValueAt(fila, 0).toString());


                PantallaAltaCentroDocente centro;
                try {

                    centro = new PantallaAltaCentroDocente(objServeis, Boolean.FALSE, idUsuario);
                    Cliente cl = new Cliente();
                    cl.setContentPane(centro);
                    cl.setVisible(true);

                } catch (RemoteException eRe) {
                    JOptionPane.showMessageDialog(null,
                            txt.getMessage("err.remoto") + "\n" + eRe.getMessage(),
                            txt.getMessage("err"), JOptionPane.ERROR_MESSAGE);
                }
            }
        });


        todos = new JRadioButton("Todos");
        todos.setBounds(new Rectangle(150, 150, 75, 20));
        todos.setMnemonic(3);
        todos.setActionCommand("TODOS");
        todos.setSelected(true);

        admin = new JRadioButton("Administrador");
        admin.setBounds(new Rectangle(220, 150, 120, 20));
        admin.setMnemonic(0);
        admin.setActionCommand("Administrador");

        secre = new JRadioButton("Secretaria");
        secre.setBounds(new Rectangle(350, 150, 100, 20));
        secre.setMnemonic(1);
        secre.setActionCommand("Secretaria");

        asist = new JRadioButton("Asistente");
        asist.setBounds(new Rectangle(450, 150, 100, 20));
        asist.setMnemonic(2);
        asist.setActionCommand("Asistente");

        // Group the radio buttons.
        ButtonGroup perfGroup = new ButtonGroup();
        perfGroup.add(todos);
        perfGroup.add(admin);
        perfGroup.add(secre);
        perfGroup.add(asist);

        this.add(todos);
        this.add(admin);
        this.add(secre);
        this.add(asist);

        todos.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent e) {
                perfil = null;
            }
        });

        admin.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent e) {
                perfil = 0;
            }
        });

        secre.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent e) {
                perfil = 1;
            }
        });

        asist.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent e) {
                perfil = 2;
            }
        });


        this.add(tablaResultados);
        this.add(getJScrollPane(), null);
    }

    private JButton getBotonBuscar() {
        if (botonBuscar == null) {
            botonBuscar = new JButton();
            botonBuscar.setBounds(new Rectangle(150, 210, 100, 30));
            botonBuscar.setText(txt.getMessage("pantConsCentro.label.buscar"));
            botonBuscar.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {
                    try {
                        if (validarFormatoDatos()) {
                            jScrollPane.setViewportView(getTablaResultados());
                        }
                    } catch (EGestioEventsException es) {
                        Utils.tratarEGestioEventsException(es);
                    }

                }
            });
        }
        return botonBuscar;
    }

    private JButton getBotonAlta() {
        if (botonAlta == null) {
            botonAlta = new JButton();
            botonAlta.setBounds(new Rectangle(10, 210, 100, 30));
            botonAlta.setText(txt.getMessage("pantConsCentro.label.alta"));
            botonAlta.addActionListener(new java.awt.event.ActionListener() {

                public void actionPerformed(java.awt.event.ActionEvent e) {

                    PantallaConsultaUsuario.this.setVisible(false);
                    PantallaAltaUsuaris usuari;
                    try {
                        usuari = new PantallaAltaUsuaris(objServeis);
                        Cliente cl = new Cliente();
                        cl.setContentPane(usuari);
                        cl.setVisible(true);

                    } catch (RemoteException eRe) {
                        JOptionPane.showMessageDialog(null,
                                txt.getMessage("err.remoto") + "\n" + eRe.getMessage(),
                                txt.getMessage("err"), JOptionPane.ERROR_MESSAGE);
                    }

                }
            });
        }
        return botonAlta;
    }

    class MyTableModel extends AbstractTableModel {

        private static final long serialVersionUID = 1L;
        protected List vCapcelera = new ArrayList();
        protected List vUsuarios = new ArrayList();

        public MyTableModel(List<Usuario> vCv) {
            setCapcelera();
            setResulTabla(vCv);
        }

        protected void setCapcelera() {
            vCapcelera.add(txt.getMessage("pantConsUsu.tabla.id"));
            vCapcelera.add(txt.getMessage("pantConsUsu.tabla.nombre"));
            vCapcelera.add(txt.getMessage("pantConsUsu.tabla.apellidos"));
            vCapcelera.add(txt.getMessage("pantConsUsu.tabla.fechaAlta"));
            vCapcelera.add(txt.getMessage("pantConsUsu.tabla.universidad"));


        }

        private void setResulTabla(List<Usuario> vCv) {
            DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            try {
                List<String> idUsuario = new ArrayList();
                List<String> nombre = new ArrayList();
                List<String> apellidos = new ArrayList();
                List<String> fechaAlta = new ArrayList();
                List<String> universidad = new ArrayList();

                for (Iterator<Usuario> it = vCv.iterator(); it.hasNext();) {
                    Usuario cv = it.next();
                    idUsuario.add(cv.getCodigo());
                    nombre.add(cv.getNombre());
                    apellidos.add(cv.getApellidos());
                    fechaAlta.add(sdf.format(cv.getFechaAlta()));

                    if (!Utils.isEmpty(cv.getCentroDocente())){
                        universidad.add(cv.getCentroDocente().getUniversidad().getNombre());
                    }else{
                        universidad.add("");
                    }
                }
                vUsuarios.add(idUsuario);
                vUsuarios.add(nombre);
                vUsuarios.add(apellidos);
                vUsuarios.add(fechaAlta);
                vUsuarios.add(universidad);

            } catch (Exception e) {
            }
        }

        public int getRowCount() {
            return (((List) vUsuarios.get(0)).size());
        }

        public int getColumnCount() {
            return (vUsuarios.size());
        }

        public String getColumnName(int col) {
            return ((String) vCapcelera.get(col));
        }

        public boolean getScrollableTrackViewportHeight() {
            return (true);
        }

        public boolean getScrollableTrackViewportWidth() {
            return (true);
        }

        public Object getValueAt(int fila, int col) {
            return (((List) vUsuarios.get(col)).get(fila));
        }

        public boolean isCellEditable(int fila, int columna) {
            return (false);
        }
    }

    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new Rectangle(10, 250, 600, 80));
        }
        jScrollPane.setVisible(false);
        return jScrollPane;
    }

    private JTable getTablaResultados() {
        try {

            MostrarCombo universidadCombo = (MostrarCombo) jComboBox1.getSelectedItem();
            MostrarCombo centroCombo = (MostrarCombo) jComboBox2.getSelectedItem();
            MostrarCombo tipoDocCombo = (MostrarCombo) comboTipoDoc.getSelectedItem();
            try {

              
                if (Utils.isEmpty(centroCombo)) {
                    centroCombo = new MostrarCombo(-1, null);
                }

               GestorDisco con=new GestorDisco();
               con.initConnection();
               GestorUsuario gs=new GestorUsuario(con.getConnection());

              List usuarios = gs.listaConsultaUsuarios(universidadCombo.getID(),
                        centroCombo.getID(), nombre.getText(), apellidos.getText(), estado, perfil,
                        desde.getText(), hasta.getText(), tipoDocCombo.getID(), numDoc.getText());

               // List usuarios = objServeis.listaConsultaUsuarios(universidadCombo.getID(),
                 //       centroCombo.getID(), nombre.getText(), apellidos.getText(), estado, perfil,
                   //     desde.getText(), hasta.getText(), tipoDocCombo.getID(), numDoc.getText());


                MyTableModel myTableModel = new MyTableModel(usuarios);

                tablaResultados.setModel(myTableModel);
                jScrollPane.setVisible(true);

            } catch (Exception u) {
                System.out.print(u);
            }

        } catch (Exception eRe) {
            JOptionPane.showMessageDialog(null,
                    txt.getMessage("client.err.remot") + "\n" + eRe.getMessage(),
                    txt.getMessage("client.err"), JOptionPane.ERROR_MESSAGE);
        }
        return tablaResultados;
    }

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBox1ActionPerformed
        try {
            rellenarCentros(new Integer(((MostrarCombo) jComboBox1.getSelectedItem()).getID()));
        } catch (RemoteException ex) {
            JOptionPane.showMessageDialog(null,
                    UtilLenguaje.getMessage("err.remoto") + "\n" + ex.getMessage(),
                    UtilLenguaje.getMessage("err"), JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_jComboBox1ActionPerformed

    private JComboBox getComboTipoDoc() {

        if (comboTipoDoc == null) {
            comboTipoDoc = new JComboBox();
            Vector<MostrarCombo> vTipoDoc;
            try {
                vTipoDoc = objServeis.listaTipoDoc();
                comboTipoDoc = new JComboBox(vTipoDoc);
                comboTipoDoc.setBounds(new Rectangle(150, 90, 100, 20));
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        txt.getMessage("pantAlta.error.remoto") + "\n" + eRe.getMessage(),
                        txt.getMessage("pantAlta.error"), JOptionPane.ERROR_MESSAGE);

            }

        }
        return comboTipoDoc;
    }

    private boolean validarFormatoDatos() throws EGestioEventsException {
        String campoFormato = null;

        if (!Utils.isEmpty(desde.getText())&& !Utils.isDate(desde.getText())) {
            campoFormato = "pantConsUsu.err.desde.formato";
        } else if (!Utils.isEmpty(hasta.getText())&&!Utils.isDate(hasta.getText())) {
            campoFormato = "pantConsUsu.err.hasta.formato";
        } else if (nombre.getText().length() > 20) {
            campoFormato = "pantConsUsu.err.nombre.formato";
        } else if (apellidos.getText().length() > 50) {
            campoFormato = "pantConsUsu.err.apellidos.formato";
        } else if (numDoc.getText().length() > 15) {
            campoFormato = "pantConsUsu.err.numDoc.formato";
        } else if (!Utils.isEmpty(hasta.getText())&& Utils.isEmpty(desde.getText())||
                (Utils.isEmpty(hasta.getText())&& !Utils.isEmpty(desde.getText()))){
            campoFormato = "pantConsUsu.err.dates.formato";
        }

        if (campoFormato != null) {
            EGestioEventsException e = new EGestioEventsException();
            e.setDescripcion(campoFormato);
            e.setTitulo("pantGestionEventos.err.titulo.campos.formato");
            throw e;
        }
        return true;
    }
}
